/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package admin;

import bazy.HibernateUtil;
import bazy.Uprawnienia;
import bazy.Uzytkownicy;
import dodatki.SHA;
import java.io.Serializable;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.validation.constraints.Size;
import logowanie.LogBean;
import org.hibernate.Session;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

/**
 * Komponent zarzadzajacy odpowiedzialny za tworzenie oraz edycje kont uzytkowników.
 * @author Grzesiek
 */
@Named(value = "uzytkownikBean")
@RequestScoped
public class UzytkownikBean implements Serializable {

    @Size(min = 3, message = "Login musi skladac się z conajmniej 3 znaków")
    private String login;
    private String haslo;
    private String haslo_2;
    @Email(message = "Błędna składnia adresu E-mail")
    @NotEmpty(message = "Pole nie może byc puste")
    private String email;
    @NotEmpty(message = "Pole nie może byc puste")
    private String imie;
    @NotEmpty(message = "Pole nie może byc puste")
    private String nazwisko;
    private String jednostka;
    private String message = "";
    private boolean error = false;
    Session session = null;
    private int id_upr;
    private int id_user;
    private String akcja = "Dodaj";
    private String naglowek = "Dodaj nowego użytkownika";
    private boolean formularz = true;

    public boolean isFormularz() {
        return formularz;
    }

    public int getId_user() {
        return id_user;
    }

    public String getNaglowek() {
        return naglowek;
    }

    public String getAkcja() {
        return akcja;
    }

    public void setAkcja(String akcja) {
        this.akcja = akcja;
    }

    public String getHaslo_2() {
        return haslo_2;
    }

    public void setHaslo_2(String haslo_2) {
        this.haslo_2 = haslo_2;
    }

    public void setId_user(int id_user) {
        this.id_user = id_user;
    }

    public int getId_upr() {
        return id_upr;
    }

    public void setId_upr(int id_upr) {
        this.id_upr = id_upr;
    }

    /** Creates a new instance of UzytkownikBean */
    public UzytkownikBean() {
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setHaslo(String haslo) {

        this.haslo = haslo;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getMessage() {
        return message;
    }

    /**
     * Wczytanie danych z bazy o użytkowniku, tak aby można było je wyświetlić na stronie.
     * @param id id użytkownika
     */
    public void edytuj(int id) {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Uzytkownicy u = (Uzytkownicy) session.load(Uzytkownicy.class, id);

        this.login = u.getLogin();
        this.email = u.getEmail();
        this.imie = u.getImie();
        this.nazwisko = u.getNazwisko();
        this.jednostka = u.getJednostka();
        this.id_upr = u.getUprawnienia().getIduprawnienia();
        this.message = "";
        this.akcja = "Edytuj";
        this.naglowek = "Edytuj dane użytkownika";
        session.getTransaction().commit();
        session.close();


    }

    /**
     * Pobranie dostępnych uprawnień dla użytkowników.
     * @return lista z uprawnieniami
     */
    public List getUprawnieniaList() {
        this.session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        List result = session.createQuery("from Uprawnienia").list();

        session.getTransaction().commit();
        session.close();
        return result;
    }

    public String getEmail() {
        return email;
    }

    public String getHaslo() {

        return haslo;
    }

    public String getLogin() {
        return login;
    }

    public String getImie() {
        return imie;
    }

    public void setImie(String imie) {
        this.imie = imie;
    }

    public String getJednostka() {
        return jednostka;
    }

    public void setJednostka(String jednostka) {
        this.jednostka = jednostka;
    }

    public String getNazwisko() {
        return nazwisko;
    }

    public void setNazwisko(String nazwisko) {
        this.nazwisko = nazwisko;
    }

    /**
     * Inicjalizacja strony, sprawdzenie uprawnień, oraz w przypadku wystąpienia parametrów widoku, odpowiednia ich obsługa.
     */
    public void inicjalizuj() {
        FacesContext context = FacesContext.getCurrentInstance();
        LogBean bean = (LogBean) context.getApplication().evaluateExpressionGet(context, "#{logBean}", LogBean.class);
        if (!bean.isLoggedin() || !bean.getUprawnienia().equals("admin")) {
            ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler();
            handler.performNavigation("brak_dostepu");
        }
        if (akcja.equals("edit")) {
            edytuj(id_user);
        }
    }

    /**
     * Dodawanie nowego użytkownika, bądź edycja już istniejącego.
     */
    public void dodaj() {
        try {
            this.session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            if (id_user == 0) {
                Uprawnienia pom = (Uprawnienia) session.load(Uprawnienia.class, id_upr);
                SHA sha = new SHA();
                String zakodowane_haslo = sha.zakoduj(haslo);
                String zakodowane_haslo_2 = sha.zakoduj(haslo_2);
                if (!zakodowane_haslo.equals(zakodowane_haslo_2)) {
                    this.message = "Hasla nie sa takie same";
                    error = true;
                    return;
                }
                if (haslo == null || haslo.length() < 3) {
                    this.message = "Hasło posiada zbyt mała liczbe znakow (min 3)";
                    error = true;
                    return;
                }
                session.save(new Uzytkownicy(pom, login, imie, nazwisko, jednostka, email, zakodowane_haslo, true, null, null));
                this.message = "Dodales nowego uzytkownika";
            } else {
                this.naglowek = "Edytuj dane użytkownika";
                Uprawnienia pom = (Uprawnienia) session.load(Uprawnienia.class, id_upr);
                Uzytkownicy do_edycji = (Uzytkownicy) session.load(Uzytkownicy.class, id_user);
                do_edycji.setUprawnienia(pom);
                do_edycji.setLogin(login);
                if (!haslo.isEmpty()) {
                    SHA sha = new SHA();
                    String zakodowane_haslo = sha.zakoduj(haslo);
                    String zakodowane_haslo_2 = sha.zakoduj(haslo_2);
                    if (!zakodowane_haslo.equals(zakodowane_haslo_2)) {
                        this.message = "Hasla nie sa takie same";
                        error = true;
                        return;
                    }
                    if (haslo == null || haslo.length() < 3) {
                        this.message = "Hasło posiada zbyt mała liczbe znakow (min 3)";
                        error = true;
                        return;
                    }
                    do_edycji.setHaslo(zakodowane_haslo);
                }
                do_edycji.setEmail(email);
                do_edycji.setJednostka(jednostka);
                do_edycji.setImie(imie);
                do_edycji.setNazwisko(nazwisko);
                session.update(do_edycji);
                this.message = "Edycja przebiegła pomyślnie";
            }
            formularz = false;
            session.getTransaction().commit();
            session.close();
        } catch (org.hibernate.exception.ConstraintViolationException ex) {
            this.message = "Istnieje użytkownik o takim Loginie.";
            formularz = true;
            session.getTransaction().commit();
            session.close();
        }
    }

    /**
     * Rozróżnienie czy jest to komunikat błędu czy informacyjny.
     * @return nazwa klasy CSS.
     */
    public String rodzajKomunikatu() {
        if (error) {
            return "error";
        }
        error = false;
        return "true";
    }
}
